import axios from 'axios'
import showToast from '/utils/showToast.js'


// 创建axios实例
const service = axios.create({
	// 基础URL，可根据环境切换
	// baseURL: process.env.NODE_ENV === 'development' ?
	// 	'http://dev-api.example.com' : 'https://api.example.com',
	baseURL: 'http://localhost:8900/api',
	timeout: 10000, // 请求超时时间
	headers: {
		'Content-Type': 'application/json;charset=utf-8'
	}
})

// 请求拦截器
service.interceptors.request.use(
	config => {
		// 从本地存储中获取token
		const token = uni.getStorageSync('token')

		// 如果token存在，则添加到请求头
		if (token) {
			config.headers.Authorization = `Bearer ${token}`
		}

		// 可以在这里对请求参数进行处理
		if (config.method === 'get') {
			// get请求参数处理
			config.params = {
				...config.params,
				_t: Date.now() // 添加时间戳防止缓存
			}
		}

		return config
	},
	error => {
		// 请求错误处理
		console.error('请求配置错误:', error)
		return Promise.reject(error)
	}
)

// 响应拦截器
service.interceptors.response.use(
	response => {
		const res = response.data
		// console.log(res);

		// 根据后端约定的状态码处理
		if (res.code !== 200) {
			// 错误提示
			showToast(res.message || '请求出错，请稍后再试')

			// 处理特定错误码
			if (res.code === 401) {
				// 未授权，需要重新登录
				uni.removeStorageSync('token')
				uni.navigateTo({
					url: '/pages/login/index'
				})
			}

			return Promise.reject(res)
		}

		return res // 返回实际数据
	},
	error => {
		console.error('接口请求失败:', error)

		// 网络错误处理
		if (!error.response) {
			showToast('网络连接失败，请检查网络')
			return Promise.reject(error)
		}

		// 根据HTTP状态码处理
		const status = error.response.status
		switch (status) {
			case 401:
				showToast('登录已过期，请重新登录')
				uni.removeStorageSync('token')
				uni.navigateTo({
					url: '/pages/login/index'
				})
				break
			case 403:
				showToast('没有权限访问该资源')
				break
			case 404:
				showToast('请求的资源不存在')
				break
			case 500:
				showToast('服务器内部错误')
				break
			default:
				showToast(`请求错误: ${status}`)
		}

		return Promise.reject(error)
	}
)

// 封装请求方法
const request = {
	/**
	 * GET请求
	 * @param {string} url 请求地址
	 * @param {object} params 请求参数
	 * @param {object} config 额外配置
	 * @returns {Promise}
	 */
	get(url, params = {}, config = {}) {
		return service.get(url, {
			params,
			...config
		})
	},

	/**
	 * POST请求
	 * @param {string} url 请求地址
	 * @param {object} data 请求数据
	 * @param {object} config 额外配置
	 * @returns {Promise}
	 */
	post(url, data = {}, config = {}) {
		return service.post(url, data, config)
	},

	/**
	 * PUT请求
	 * @param {string} url 请求地址
	 * @param {object} data 请求数据
	 * @param {object} config 额外配置
	 * @returns {Promise}
	 */
	put(url, data = {}, config = {}) {
		return service.put(url, data, config)
	},

	/**
	 * DELETE请求
	 * @param {string} url 请求地址
	 * @param {object} params 请求参数
	 * @param {object} config 额外配置
	 * @returns {Promise}
	 */
	delete(url, params = {}, config = {}) {
		return service.delete(url, {
			params,
			...config
		})
	}
}

export default request